package net.servir.capacidades.dao.jdbc;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.capacidades.dao.HistoricoDAO;
import net.servir.capacidades.model.HisParticipante;
import net.servir.capacidades.model.HisTestResultado;
import net.servir.capacidades.model.PreguntaExamen;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcHistoricoDAO implements HistoricoDAO {

	private SimpleJdbcTemplate jdbcTemplate;
	private DataSource dataSource;
	
	
	@Autowired
	public JdbcHistoricoDAO(DataSource dataSource){
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.dataSource = dataSource;
	}
	
	public List<HisParticipante> getExamenesParticipante(Number idServicioCivil)
	{
		List<HisParticipante> list = new LinkedList<HisParticipante>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT p.ID_PARTICIPANTE,p.ID_PUESTO_TIPO,p.ID_SECTOR_PREGUNTA,p.ID_TEST,p.ID_SERVICIO_CIVIL,p.COD_SESION,case p.EVALUADO when '1' then 'EVALUADO' else 'NO EVALUADO' end as EVALUADO,p.USUARIO_ACT,to_char(p.FEC_ACT,'DD/MM/YYYY') as FEC_ACT,p.ESTADO,p.ID_NIVEL_GOBIERNO,p.PUESTO_TIPO,p.NIVEL_GOBIERNO");
		sql.append(" ,te.test, to_char(te.fh_inicio,'DD/MM/YYYY HH24:MI') as fh_inicio");
		sql.append(" FROM HIS_PARTICIPANTE p join his_test te on p.id_test = te.id_test");
		sql.append(" WHERE p.id_servicio_civil = ? ");
		sql.append(" ORDER BY te.fh_inicio ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idServicioCivil);
		for(Map<String, Object> rec : collec){
			HisParticipante obj = new HisParticipante();
			obj.setId_participante((Number)rec.get("ID_PARTICIPANTE"));
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_sector_pregunta((Number)rec.get("ID_SECTOR_PREGUNTA"));
			obj.setId_test((Number)rec.get("ID_TEST"));
			obj.setId_servicio_civil((Number)rec.get("ID_SERVICIO_CIVIL"));
			obj.setCod_sesion((String)rec.get("COD_SESION"));
			obj.setEvaluado((String)rec.get("EVALUADO"));
			obj.setUsuario_act((String)rec.get("USUARIO_ACT"));
			obj.setFec_act((String)rec.get("FEC_ACT"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setId_nivel_gobierno((Number)rec.get("ID_NIVEL_GOBIERNO"));
			obj.setPuesto_tipo((String)rec.get("PUESTO_TIPO"));
			obj.setNivel_gobierno((String)rec.get("NIVEL_GOBIERNO"));
			
			obj.setTest((String)rec.get("TEST"));
			obj.setFh_inicio((String)rec.get("FH_INICIO"));

			list.add(obj);
		}
		return list;
		
	}	
	public List<PreguntaExamen> getPreguntasExamen(Number idParticipante)
	{
		List<PreguntaExamen> list = new LinkedList<PreguntaExamen>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT pg.secuencia, pg.combinacion, pg.id_pregunta,pg.respuesta_seleccionada,pg.respuesta_correcta,pre.pregunta   ");
		sql.append(" ,case substr(pg.combinacion,1,1) when 'A' then pre.respuesta when 'B' then pre.alternativa_1 when 'C' then pre.alternativa_2 when 'D' then pre.alternativa_3 when 'E' then pre.alternativa_4 end as Opcion1");
		sql.append(" ,case substr(pg.combinacion,2,1) when 'A' then pre.respuesta when 'B' then pre.alternativa_1 when 'C' then pre.alternativa_2 when 'D' then pre.alternativa_3 when 'E' then pre.alternativa_4 end as Opcion2");
		sql.append(" ,case substr(pg.combinacion,3,1) when 'A' then pre.respuesta when 'B' then pre.alternativa_1 when 'C' then pre.alternativa_2 when 'D' then pre.alternativa_3 when 'E' then pre.alternativa_4 end as Opcion3");
		sql.append(" ,case substr(pg.combinacion,4,1) when 'A' then pre.respuesta when 'B' then pre.alternativa_1 when 'C' then pre.alternativa_2 when 'D' then pre.alternativa_3 when 'E' then pre.alternativa_4 end as Opcion4");
		sql.append(" ,case substr(pg.combinacion,5,1) when 'A' then pre.respuesta when 'B' then pre.alternativa_1 when 'C' then pre.alternativa_2 when 'D' then pre.alternativa_3 when 'E' then pre.alternativa_4 end as Opcion5");
		sql.append(" FROM his_test_generado tg join his_preguntas_generadas pg on tg.id_test_generado = pg.id_test_generado");
		sql.append(" left join his_pregunta pre on pg.id_pregunta = pre.id_pregunta");
		sql.append(" WHERE tg.id_participante =  ? and pre.id_test in (Select id_test from his_participante where id_participante =?)");
		
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idParticipante,idParticipante);
		for(Map<String, Object> rec : collec){
			PreguntaExamen obj = new PreguntaExamen();
			obj.setSecuencia((Number)rec.get("secuencia"));
			obj.setId_pregunta((Number)rec.get("Id_pregunta"));
			obj.setPregunta((String)rec.get("Pregunta"));
			obj.setOpcion1((String)rec.get("Opcion1"));
			obj.setOpcion2((String)rec.get("Opcion2"));
			obj.setOpcion3((String)rec.get("Opcion3"));
			obj.setOpcion4((String)rec.get("Opcion4"));
			obj.setOpcion5((String)rec.get("Opcion5"));
			obj.setRespuesta_correcta((String)rec.get("Respuesta_correcta"));
			obj.setRespuesta_seleccionada((String)rec.get("Respuesta_seleccionada"));

			list.add(obj);
		}
		return list;
		
	}
	public List<HisTestResultado> getResultadosExamen(Number idParticipante)
	{
		List<HisTestResultado> list = new LinkedList<HisTestResultado>();

		StringBuilder sql = new StringBuilder();
		sql.append("Select tr.id_grupo_califica,tr.nemotecnico,tr.grupo_calificacion,tr.nro_preguntas,tr.nro_aciertos, tr.nro_aciertos_minimo ,case when  tr.nro_aciertos < tr.nro_aciertos_minimo then 'Si' else 'No' end as req_capacitacion ");
		sql.append(" from his_test_generado tg join his_test_resultado tr on tg.id_test_generado = tr.id_test_generado");
		sql.append(" where tg.id_participante = ? ");
		sql.append(" order by tr.nemotecnico");
		
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idParticipante);
		for(Map<String, Object> rec : collec){
			HisTestResultado obj = new HisTestResultado();
			
			obj.setId_grupo_califica((Number)rec.get("Id_grupo_califica"));
			obj.setGrupo_calificacion((String)rec.get("Grupo_calificacion"));
			obj.setNemotecnico((String)rec.get("Nemotecnico"));
			obj.setNro_preguntas((Number)rec.get("Nro_preguntas"));
			obj.setNro_aciertos((Number)rec.get("Nro_aciertos"));
			obj.setNro_aciertos_minimo((Number)rec.get("Nro_aciertos_minimo"));
			obj.setReq_capacitacion((String)rec.get("Req_capacitacion"));
			
			list.add(obj);
		}
		return list;		
	}
	
}
